package com.example.prueba1clinicacliente;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Iterator;

import org.json.JSONException;
import org.json.JSONObject;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import org.xmlpull.v1.XmlPullParserException;

import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;

import com.example.prueba1clinicacliente.IngresarPrestacion.AgregarPrestacionBackground;
import com.example.prueba1clinicacliente.IngresarPrestacion.ObtenerPacientesPrestacionesBackground;
import com.google.gson.JsonObject;

/**
 * Esta clase permite actualizar los datos de la prestacion enviando los datos en formato JSON hacia el webservice.
 * @author Renew21
 *
 */
public class ActualizarPrestacion extends Activity{

	//Se declaran los atributos.
		private String URL = Constantes.HOST + "/Prueba1ClinicaSoap/services/ClinicaWebService";
		private String NAMESPACE = "http://com.webservice.orm";	
		private ArrayList<String> pacientes;
		private ArrayList<String> opcPrestaciones;
		private Spinner pacientesSpinner;
		private Spinner opcPrestacionesSpinner;
		private EditText diagnostico;
		private Button fecha;
		private int mYear;    
	    private int mMonth;    
	    private int mDay;
	    static final int DATE_DIALOG_ID = 0;
	    private Prestacion prestacion;
	    
	  //Se declara un objeto DatePicker que contiene el calendario que visualizara el usuario.
	    private DatePickerDialog.OnDateSetListener mDateSetListener =            
	        	new DatePickerDialog.OnDateSetListener() {                
	        	public void onDateSet(DatePicker view, int year,                                       
	        			int monthOfYear, int dayOfMonth) {                    
	        		mYear = year;                    
	        		mMonth = monthOfYear;                    
	        		mDay = dayOfMonth;                    
	        		updateDisplay();                
	        		}            
	        	};
	        	
	        	private void updateDisplay() {        
	        		fecha.setText(            
	            			new StringBuilder()                    
	            			// El mes parte de 0 por lo que se le suma 1.                    
	            			.append(mMonth + 1).append("-")                    
	            			.append(mDay).append("-")                    
	            			.append(mYear).append(" "));    
	            }
	        	@Override
	            protected Dialog onCreateDialog(int id) {    
	            	switch (id) {   
	            		case DATE_DIALOG_ID:        
	            			return new DatePickerDialog(this,                    
	            					mDateSetListener,                    
	            					mYear, mMonth, mDay);    
	            			}    
	            	return null;
	            	}

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.actualizar_prestacion);
		//Inicializo los atributos relacionandolos con los del layout.
		pacientesSpinner = (Spinner) findViewById(R.id.spn_rutPaciente_act);
		opcPrestacionesSpinner = (Spinner) findViewById(R.id.spn_prestacion_act);
		diagnostico = (EditText) findViewById(R.id.txt_diagnostico_act);
		fecha = (Button) findViewById(R.id.txt_fecha_act);
		pacientes = new ArrayList<String>();
		opcPrestaciones = new ArrayList<String>();
		
		new ObtenerPacientesPrestacionesBackground().execute();
				
		// obteniene la fecha actual        
		final Calendar c = Calendar.getInstance();        
		mYear = c.get(Calendar.YEAR);        
		mMonth = c.get(Calendar.MONTH);        
		mDay = c.get(Calendar.DAY_OF_MONTH);        
		// metodo que actualiza el texto del boton      
		updateDisplay();
		
	}

	/**
	 * Metodo que permite vizualizar el calendario en el layout para que el usuario pueda ingresar una fecha.
	 * @param v Recibe el evento clic del usuario en el boton.
	 */
	public void ingresarFecha(View v){
		
		showDialog(DATE_DIALOG_ID); 
		
	}
	
	/**
	 * Este metodo construye un JSON con los datos de la prestacion que se desea actualizar.
	 * @param v Recibe el clic de boton guardar del layout.
	 */
	public void guardarPrestacion(View v){
		//Se crea el objeto JSON que contendra los datos de la prestacion.
				JsonObject jsonObjectRegistro = new JsonObject();
				
				//Se construye el JSON con los datos que ingresa el usuario.
				jsonObjectRegistro.addProperty("idPrestacion",prestacion.getIdPrestacion());
				jsonObjectRegistro.addProperty("diagnostico",diagnostico.getText().toString());
				jsonObjectRegistro.addProperty("fecha", fecha.getText().toString());
				jsonObjectRegistro.addProperty("rutPaciente", pacientes.get(pacientesSpinner.getSelectedItemPosition()));
				jsonObjectRegistro.addProperty("idOpcion", opcPrestaciones.get(opcPrestacionesSpinner.getSelectedItemPosition()));
				new ActualizarPrestacionBackground().execute(jsonObjectRegistro.toString());
	}
	

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_prestacion, menu);
        return true;
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.eliminar_prestacion:
            	Log.d("",prestacion.getIdPrestacion().toString());
            	new EliminarPrestacionBackground().execute(Integer.parseInt(prestacion.getIdPrestacion().toString()));
            	return true;
            default:
                return true;
        }
    }

	/**
	 * Se actualizan los datos de la prestacion enviando estos en formato JSON hacia el webservice.
	 * @author Renew21
	 *
	 */
	class ActualizarPrestacionBackground extends AsyncTask<String, Void, String>{

		private ProgressDialog progressDialog;

		@Override
		protected void onPreExecute() {
			progressDialog = ProgressDialog.show(
					ActualizarPrestacion.this,
					"Pacientes", 
					"Espere mientras se cargan los datos existentes...", 
					true);
			super.onPreExecute();
		}

		@Override
		protected String doInBackground(String... params) {

			//Se llama el metodo actualizarPrestacion para se ejecute con el parametro que se enviara.
			String resultado = new String();
			String METHOD_NAME = "actualizarPrestacion";
			String SOAP_ACTION = NAMESPACE +"/" +METHOD_NAME;
			SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
			SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
			soapEnvelope.dotNet = true;
			soapEnvelope.implicitTypes = true;
			soapEnvelope.setOutputSoapObject(request);

			//Se envia como parametro el JSON con los datos de la prestacion.
			request.addProperty("jsonPelicula", params[0]);

			HttpTransportSE aht = new HttpTransportSE(URL);

			try {
				aht.call(SOAP_ACTION, soapEnvelope);
				SoapPrimitive resultString = (SoapPrimitive)soapEnvelope.getResponse();
				resultado = resultString.toString();

			} catch (IOException e) {
				e.printStackTrace();
			} catch (XmlPullParserException e) {
				e.printStackTrace();
			}

			return resultado;
		}

		@Override
		protected void onPostExecute(String result) {
			super.onPostExecute(result);
			progressDialog.dismiss();
			
			//Valido que tenga la informacion necesaria
			if("1".equals(result)){
				Toast.makeText(ActualizarPrestacion.this, "Ingresada correctamente", Toast.LENGTH_LONG).show();
				finish();
			}else{
				Toast.makeText(ActualizarPrestacion.this, "Error al obtener la informacion necesaria", Toast.LENGTH_LONG).show();
			}
		}
	}

	/**
	 * Se envia como parametro el id de la prestacion que se desea eliminar hacia el webservice.
	 * @author Renew21
	 *
	 */
	class EliminarPrestacionBackground extends AsyncTask<Integer, Void, String>{

		private ProgressDialog progressDialog;

		@Override
		protected void onPreExecute() {
			progressDialog = ProgressDialog.show(
					ActualizarPrestacion.this,
					"Pacientes", 
					"Espere mientras se elimina el paciente...", 
					true);
			super.onPreExecute();
		}

		@Override
		protected String doInBackground(Integer... params) {

			//Se llama al metodo eliminarPrestacion para que se ejecute con el parametro que se envia.
			String resultado = new String();
			String METHOD_NAME = "eliminarPrestacion";
			String SOAP_ACTION = NAMESPACE +"/" +METHOD_NAME;
			SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
			SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
			soapEnvelope.dotNet = true;
			soapEnvelope.implicitTypes = true;
			soapEnvelope.setOutputSoapObject(request);

			request.addProperty("prestacionId", params[0]);

			HttpTransportSE aht = new HttpTransportSE(URL);

			try {
				aht.call(SOAP_ACTION, soapEnvelope);
				SoapPrimitive resultString = (SoapPrimitive)soapEnvelope.getResponse();
				resultado = resultString.toString();

			} catch (IOException e) {
				e.printStackTrace();
			} catch (XmlPullParserException e) {
				e.printStackTrace();
			}

			return resultado;
		}

		@Override
		protected void onPostExecute(String result) {
			super.onPostExecute(result);
			progressDialog.dismiss();
			//Valido que tenga la informacion necesaria
			if("1".equals(result)){
				Toast.makeText(ActualizarPrestacion.this, "Eliminada correctamente", Toast.LENGTH_LONG).show();
				finish();
			}else{
				Toast.makeText(ActualizarPrestacion.this, "Error al obtener la informacion necesaria", Toast.LENGTH_LONG).show();
			}
		}
	}


	/**
	 * Esta clase permite obtener los datos contenidos en el JSON del web service tanto de los pacientes
	 * como tambien los de los diferentes tipos de prestacion existentes en la base de datos.
	 * @author Renew21
	 *
	 */
	class ObtenerPacientesPrestacionesBackground extends AsyncTask<Void, Void, HashMap<String, String>>{
		
		private ProgressDialog progressDialog;

		@Override
		protected void onPreExecute() {
    		progressDialog = ProgressDialog.show(
    				ActualizarPrestacion.this,
    				"Prestaciones", 
    				"Espere mientras se carga el sistema...", 
    				true);
			super.onPreExecute();
		}
		
		@Override
		protected HashMap<String, String> doInBackground(Void... params) {

			HashMap<String, String> resultado = new HashMap<String, String>();
			String pacientesJSON="";
			String METHOD_NAME = "obtenerRutPacientes";
			String SOAP_ACTION = NAMESPACE +"/" +METHOD_NAME;
			SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
			SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
			soapEnvelope.dotNet = true;
			soapEnvelope.implicitTypes = true;
			soapEnvelope.setOutputSoapObject(request);

			HttpTransportSE aht = new HttpTransportSE(URL);

			try {
				aht.call(SOAP_ACTION, soapEnvelope);
				SoapPrimitive resultString = (SoapPrimitive)soapEnvelope.getResponse();
				pacientesJSON = resultString.toString();
				resultado.put("pacientes", pacientesJSON);

			} catch (IOException e) {
				e.printStackTrace();
			} catch (XmlPullParserException e) {
				e.printStackTrace();
			}

			String opcPrestacionesJSON="";
			METHOD_NAME = "obtenerOpcionPrestaciones";
			SOAP_ACTION = NAMESPACE +"/" +METHOD_NAME;
			request = new SoapObject(NAMESPACE, METHOD_NAME);
			soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
			soapEnvelope.dotNet = true;
			soapEnvelope.implicitTypes =true;
			soapEnvelope.setOutputSoapObject(request);

			aht = new HttpTransportSE(URL);

			try {
				aht.call(SOAP_ACTION, soapEnvelope);
				SoapPrimitive resultString = (SoapPrimitive)soapEnvelope.getResponse();
				opcPrestacionesJSON = resultString.toString();
				resultado.put("opcPrestaciones", opcPrestacionesJSON);

			} catch (IOException e) {
				e.printStackTrace();
			} catch (XmlPullParserException e) {
				e.printStackTrace();
			}

			return resultado;
		}

		@Override
		protected void onPostExecute(HashMap<String, String> result) {
			super.onPostExecute(result);
			progressDialog.dismiss();
			
			prestacion = (Prestacion) getIntent().getExtras().getSerializable("prestacion");
			Log.d("", prestacion.toString());
			diagnostico.setText(prestacion.getDiagnostico());
			fecha.setText(prestacion.getFecha().toString());
			
			//Valido que tenga la informacion necesaria
			if(result.containsKey("pacientes") && !"".equals(result.get("pacientes"))){
				try {
					ArrayList<String> pacientesList = new ArrayList<String>();
					JSONObject pacienteResultado = new JSONObject(result.get("pacientes"));
					JSONObject pacientesJSONArray = new JSONObject(pacienteResultado.toString());
					pacientesJSONArray.names();
					pacientesJSONArray.keys();
					for (Iterator iterator = pacientesJSONArray.keys(); iterator.hasNext();) {
						String string = (String) iterator.next();
						pacientes.add(string);
						pacientesList.add(pacientesJSONArray.getString(string));
						
					}
					
					ArrayAdapter<String> pacientesAdapter = new ArrayAdapter<String>(ActualizarPrestacion.this, android.R.layout.simple_spinner_item, pacientesList);
					pacientesSpinner.setAdapter(pacientesAdapter);
					
					for(String paciente : pacientes){
						if(paciente.equals(prestacion.getRutPaciente())){
							Log.d("", pacientes.indexOf(paciente)+"");
							pacientesSpinner.setSelection(pacientes.indexOf(paciente));
						}
					}

				} catch (JSONException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}


			}else{
				Toast.makeText(ActualizarPrestacion.this, "Error al obtener la informacion necesaria", Toast.LENGTH_LONG).show();
			}
			
			if(result.containsKey("opcPrestaciones") && !"".equals(result.get("opcPrestaciones"))){
				try {
					ArrayList<String> opcPrestacionesList = new ArrayList<String>();
					JSONObject opcPrestacionesResultado = new JSONObject(result.get("opcPrestaciones"));
					JSONObject opcPrestacionesJSONArray = new JSONObject(opcPrestacionesResultado.toString());
					opcPrestacionesJSONArray.names();
					opcPrestacionesJSONArray.keys();
					for (Iterator iterator = opcPrestacionesJSONArray.keys(); iterator.hasNext();) {
						String string = (String) iterator.next();
						opcPrestaciones.add(string);
						opcPrestacionesList.add(opcPrestacionesJSONArray.getString(string));
						
					}
					
					ArrayAdapter<String> opcPrestacionesAdapter = new ArrayAdapter<String>(ActualizarPrestacion.this, android.R.layout.simple_spinner_item, opcPrestacionesList);
					opcPrestacionesSpinner.setAdapter(opcPrestacionesAdapter);
					
					for(String opcPrestacion : opcPrestaciones){
						if(opcPrestacion.equals(prestacion.getIdOpcion())){
							Log.d("", opcPrestaciones.indexOf(opcPrestacion)+"");
							opcPrestacionesSpinner.setSelection(opcPrestaciones.indexOf(opcPrestacion));
						}
					}
					
				} catch (JSONException e) {
					e.printStackTrace();
				}


			}else{
				Toast.makeText(ActualizarPrestacion.this, "Error al obtener la informacion necesaria", Toast.LENGTH_LONG).show();
			}
		}
	}
}
